查看原文
其他

Merge 还是 Rebase?这是个问题

W3docs 高可用架构 2020-11-06

事实上,虽然方式不同,但是git rebase 和 git merge 做的是同一件事。两者都是将一个分支的git提交整合到另一个分支中,但它们各自如何达到预期的结果,我们将在本文的范围内进行讨论。

首先,让我们深入研究一下这两个命令,以便找到最适合你的工作流程。


Git Merge


Git merge 将源分支的内容与目标分支进行整合。因此,只有目标分支被改变,而源分支的历史记录保持原样。换句话说,进行合并的时候,您的 HEAD 分支会生成新的 git commit,并保持历史commit。


优势

  • 使用方式简单。

  • 保留源分支的原始上下文。

  • 保留提交历史和时间顺序。

  • 将源分支的commit与另一个分支的commit分开。


劣势

大量的commit合并使历史记录变得混乱,从而使Git仓库的可视化图表中出现了包含无用信息的彩虹分支线(可能需要修改)。


Git Rebase


Git rebase 将所有的改动合并成一个补丁,并将补丁整合到目标分支中。merge和rebase的最重要的区别是后者清理历史提交记录。在从一个分支转移到另一个分支的过程中,不需要的部分会被删除,以保持线性提交记录。如果你在当前功能分支中需要包含主分支的最近更新,但主分支的历史必须保持干净时,这个命令就很方便了。

rebase将一个分支的变化重写到另一个分支,而不需要创建新的提交记录。


优势

  • 保证线性提交记录和可读性,清除复杂的历史记录。

  • 清理commit,使其成为一个commit。


劣势

  • 对pull请求不起作用,因为你无法看到团队成员分别做了哪些改动。

  • 可以隐藏上下文。


什么时候Merge什么时候Rebase


现在你已经区分了两种策略,让我们来讨论用例。


调查


在做出决定之前,仔细调查总是一个好主意。需要注意的是,所选择的策略应该与你的工作流程相匹配。一种工作流程策略对某个团队来说可能很好,而对另一个团队来说可能是致命的。因此,在选择某个策略之前,要考虑其优劣。


独立工作 vs 团队合作

如果你是单独工作,选择rebase而非merge可能会更方便。如果你与其他成员共享分支,你从该分支中获取更新,rebase 过程将产生不一致。

一定要考虑到merge保留了提交记录,而rebase则重写了提交记录!


在基于功能的工作流的情况下,git merge可能是你团队的正确选择。它还能帮助你避免还原或重置任何东西。

merge的结果,不同的功能保持隔离,不会干扰现有的提交历史。如果优先考虑的是保持一尘不染的提交记录,那么git rebase是一个更合适的版本,以避免不相关的提交。


冲突


revert rebase比revert merge要困难得多,因为rebase冲突时revert 一次提交,而merge冲突时需要revert全部提交。Git允许预览合并分支时的情况。

然而,不要乱用rebase! 除非你知道自己在做什么,否则不要rebase。不正确的rebase会让你陷入困境,导致严重的后果。

永远记住不要在共享分支上rebase。


总之,rebase和merge通过选择不同的方式提供了相同的结果。每种方式都有其独特之处。我之蜜糖,彼之砒霜,对来某种情况说是非常有用的方式,但对另一种情况来说可能是致命的。仔细调查可以防止出现混乱。因此,始终要考虑到当前的情况以及你和你的团队可能遇到的障碍。


原文地址:

https://levelup.gitconnected.com/merge-or-rebase-thats-the-problem-11d65944b7e


参考阅读:



本文由高可用架构翻译,技术原创及架构实践文章,欢迎通过公众号菜单「联系我们」进行投稿。


高可用架构
改变互联网的构建方式

长按二维码 关注「高可用架构」公众号

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存